package br.com.medmark.bean;

import java.io.Serializable;
import java.util.Map;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.servlet.ServletContext;

import org.apache.log4j.Logger;
import org.primefaces.util.MessageFactory;


/**
 * Classe que engloba os métodos e os atributos que serão comuns a todos os Beans, considerando algumas pequenas
 * exceções.
 * 
 */
public class BeanGenerico implements Serializable{
	
	private static final long serialVersionUID = -8618575071766217566L;
	
	protected static Logger			logger	= Logger.getLogger(BeanGenerico.class.getName());

	
	/**
	 * Utilizado no envio de arquivos. Este método resgata o caminho da aplicação.
	 * 
	 * @return caminho da aplicação {@Link String}
	 */
	public String getPathAplicacao() {
		FacesContext fc = FacesContext.getCurrentInstance();
		ServletContext sc = (ServletContext) fc.getExternalContext().getContext();
		String realPath = sc.getRealPath("/");
		return realPath;
	}
	
	public void initSession(){
		FacesContext.getCurrentInstance().getExternalContext().getSession(true);
	}
	
	public void invalidateSession(){
		FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
	}
	
	/**
	 * Utilizado para realizar uma busca na sessão.
	 * 
	 * @param key
	 * @return Object
	 */
	public Object getFromSession(String key) {
		Map<String, Object> sessionMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
		return sessionMap.get(key);
	}

	protected void putInSession(String key, Object value) {
		Map<String, Object> sessionMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap(); 
		if(sessionMap.containsKey(key)){
			sessionMap.remove(key);
		}
		sessionMap.put(key, value);
	}

	/**
	 * Utilizado para adicionar mensagens no log e na UI.
	 * 
	 * @param message
	 *            {@Link FacesMessage}
	 */
	public void addMessage(FacesMessage message) {
		FacesContext.getCurrentInstance().addMessage(null, message);
		logger.info(message);
	}
	
	public void addMessage(FacesMessage.Severity tipo, String nomeMensagem){
		FacesMessage message = MessageFactory.getMessage(nomeMensagem, tipo, new String[] {});
		addMessage(message);
	}

	public void addMessage(String componente, FacesMessage.Severity tipo, String nomeMensagem) {
		FacesContext fc = FacesContext.getCurrentInstance();
		FacesMessage message = MessageFactory.getMessage(nomeMensagem, tipo, new String[] {});
		fc.addMessage(componente, message);
		logger.info(message);
	}

	public void addMessage(String componente, FacesMessage.Severity tipo, String nomeMensagem, String erro) {
		FacesContext fc = FacesContext.getCurrentInstance();
		fc.addMessage(componente, MessageFactory.getMessage(nomeMensagem, tipo, new String[] {}));
		logger.info(erro);
	}

	/**
	 * Utilizado para adicionar mensagens mais detalhadas no log e na UI.
	 * 
	 * @param tipo
	 *            {@link FacesMessage.Severity}
	 * @param causa
	 *            {@link String}
	 * @param detalhe
	 *            {@link String}
	 */
	public void addMessage(FacesMessage.Severity tipo, String causa, String detalhe) {
		FacesMessage message = new FacesMessage(tipo, causa, detalhe);
		FacesContext.getCurrentInstance().addMessage(null, message);
		logger.info(tipo.toString() + " " + causa + " " + detalhe);
	}
}
